// import { defineConfig } from 'vite'
import vue from "@vitejs/plugin-vue";

// // https://vitejs.dev/config/
// export default defineConfig({
//   plugins: [vue()],
// })
import { fileURLToPath, URL } from "node:url";
import { defineConfig } from "vite";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import { loadEnv } from "vite";
import { resolve } from "path";
// vite.config.ts 中 include 配置，fix ...的文件列表中。项目必须列出所有文件,或使用 "include" 模式。
import { viteMockServe } from "vite-plugin-mock";
// 不能配置 tsconfig.node.json，否则 yarn build 会失败
import { createSvg } from "./src/assets/icons/index";
import { viteSingleFile } from "vite-plugin-singlefile";
import ckeditor5 from "@ckeditor/vite-plugin-ckeditor5";
import { createRequire } from "node:module";
const require = createRequire(import.meta.url);

export default ({ command, mode }) => {
  // "dev": "cross-env DEBUG=INFO,api NODE_ENV=development vite",
  // var appDebug = debug("INFO");
  const appDebug = (title: string, params: any) => {
    console.log(title, params);
  };

  let env = loadEnv(mode, process.cwd());
  // var isMock = convertToBoolean(env.VITE_MOCK_ENABLED);
  // var isDemo = convertToBoolean(env.VITE_DEMO_ENABLED);
  var isMock = env.VITE_MOCK_ENABLED;
  var isDemo = env.VITE_DEMO_ENABLED;
  if (isMock == "true") {
    // 启动 mock VITE_API_URL 和 VITE_APP_PORT 的端口需要保持一致
    let url = env.VITE_API_URL.substring(0, env.VITE_API_URL.lastIndexOf(":"));
    env.VITE_API_URL = url + ":" + env.VITE_APP_PORT;
  }
  // todo npm run dev 时 command 输出 serve，理解应该输出 dev
  // appDebug("vite.config.ts", command, mode, mock, typeof mock);
  appDebug("MODE \t\t\t\t", mode);
  appDebug("VITE_APP_PROFILES \t\t", env.VITE_APP_PROFILES);
  appDebug("VITE_APP_VER \t\t\t", env.VITE_APP_VER);
  appDebug("VITE_APP_INTERNAL_NAME \t\t", env.VITE_APP_INTERNAL_NAME);
  appDebug("VITE_APP_TITLE \t\t\t", env.VITE_APP_TITLE);
  appDebug("VITE_APP_LOGIN_TITLE \t\t", env.VITE_APP_LOGIN_TITLE);
  appDebug("VITE_APP_LOGO_BIG \t\t", env.VITE_APP_LOGO_BIG);
  appDebug("VITE_APP_LOGO_SMALL \t\t", env.VITE_APP_LOGO_SMALL);
  appDebug("VITE_APP_PORT \t\t\t", env.VITE_APP_PORT);
  appDebug("VITE_API_URL \t\t\t", env.VITE_API_URL);
  appDebug("VITE_API_AUTH_CONTEXT_PATH \t", env.VITE_API_AUTH_CONTEXT_PATH);
  appDebug("VITE_API_ADMIN_CONTEXT_PATH \t", env.VITE_API_ADMIN_CONTEXT_PATH);
  appDebug("VITE_API_CMS_CONTEXT_PATH \t", env.VITE_API_CMS_CONTEXT_PATH);
  appDebug("VITE_MOCK_ENABLED \t\t", isMock);
  appDebug("VITE_DEMO_ENABLED \t\t", isDemo);

  return defineConfig({
    plugins: [
      vue(),
      // 注释可以禁用单文件打包，仅在打包时打开，dev 时打开会造成 nginx 无法正确路由
      // viteSingleFile(),
      ckeditor5({ theme: require.resolve("@ckeditor/ckeditor5-theme-lark") }),
      AutoImport({
        resolvers: [ElementPlusResolver()],
      }),
      Components({
        resolvers: [ElementPlusResolver()],
      }),
      createSvg("./src/assets/icons/svg/"),
      viteMockServe({
        ignore: /^\_/,
        // mockPath: resolve(__dirname, "./mock"),
        // mockPath: "./src/mock",
        mockPath: "./mock",
        supportTs: true,
        watchFiles: true,
        // 开发打包开关
        localEnabled: isMock === "true",
        // 生产打包开关，会影响最终打包文件的尺寸，关闭时减少 0.5M 左右
        prodEnabled: isMock === "true",
        // 如果生产环境开启了 mock 功能，则该代码会被注入到 injectFile 对应的文件的底部。默认为 main.{ts,js}
        injectCode: `
               // 相对 main.ts 的路径，如果放在 src 外面 ../mock/mockProdServer
               import { setupProdMockServer } from '../mock/mockProdServer';
               setupProdMockServer();
            `,
        // 是否在控制台显示请求日志
        logger: true,
      }),
    ],
    server: {
      host: "127.0.0.1",
      // 端口
      port: Number(loadEnv(mode, process.cwd()).VITE_APP_PORT),
      // 端口被占用则直接退出
      strictPort: true,
      // https
      https: false,
      // 开发服务器启动时自动在浏览器中打开应用
      open: true,
      // proxy: {
      //   // 选项写法
      //   "/api": {
      //     // target: 'http://jsonplaceholder.typicode.com',
      //     target: loadEnv(mode, process.cwd()).VITE_APP_URL,
      //     changeOrigin: true,
      //     rewrite: (path) => path.replace(/^\/api/, ""),
      //   },
      // },
      // 模块热替换
      hmr: {
        overlay: false,
      },
    },

    resolve: {
      alias: {
        // "@": resolve(__dirname, "./src"),
        "@": fileURLToPath(new URL("./src", import.meta.url)),
        // utils: resolve(__dirname, "./src/utils"),
      },
    },
    css: {
      preprocessorOptions: {
        scss: {
          additionalData:
            // '@import "@/assets/styles/global.scss"; @import "@/assets/styles/variables.scss";',
            '@import "@/assets/styles/index.scss"; ',
          charset: false,
        },
      },
    },
    // build: {
    //   // 打包输出 dist 文件夹名称
    //   // outDir: "app-online",
    //   // 打包输出 assets 文件夹名称
    //   // assetsDir: "includes",
    //   // 打包不混淆代码
    //   minify: false,
    //   // chunk 大小警告的限制（以 kbs 为单位）
    //   chunkSizeWarningLimit: 1500,
    //   rollupOptions: {
    //     output: {
    //       manualChunks(id) {
    //         if (id.includes("node_modules")) {
    //           return id
    //             .toString()
    //             .split("node_modules")[1]
    //             .split("/")[0]
    //             .toString();
    //         }
    //       },
    //     },
    //   },
    // },
    // fix 打包生成 dist 文件夹中 html 引用资源使用相对路径，同时是 nginx 路由配置
    // base: "./",
    base: env.VITE_BASE,
  });
};
